百度程序员开发避坑指南(前端篇)
01
1.1 问题描述
1.2 分析
c.js 以及其依赖的a.js, b.js等 加载非常慢或直接失败;
c.js 以及其依赖逻辑发生JS异常。
1.3 监控实现
window.addEventListener('error', event => {
if (event.srcElement !== window) {
console.log('资源加载失败,加载资源的元素是:', event.srcElement);
send();
}
else {
console.log('JS报错:', event.message);
send();
}
}, true);
window.addEventListener('unhandledrejection', event => {
const error = event.reason || {};
console.log('JS报错:', error);
send();
});
access-control-allow-origin: *
ctx.set('Access-Control-Allow-Origin', '*');
<script src="https://cdn.a.com/static/a.js" crossorigin="anonymous"></script>
const list = performance.getEntriesByType('resource');
const len = list.length;
const slowList = [];
for (let i = 0; i < len; i++) {
const timing = list[i];
// 大于1s
if (timing.duration > 1000) {
slowList.push(timing);
}
}
send(slowList);
// timing.name就是资源地址,适合
const img = document.body.querySelector('img[src="' + timing.name + '"]');
const xpath = getxpath(img);
1.4 数据分析
1.5 总结
02
2.1 含义
当前元素的堆叠顺序 当前元素是否建立新的堆叠上下文
2.2 属性值
默认值:z-index:auto; 整数值:z-index:<integer>; 继承:z-index:inherit;
2.3 基本特性
在CSS2.1时代,需要和定位元素配合使用; 如果定位元素z-index没有发生嵌套(并列的): 后来者居上的准则; 哪个大哪个上(z-index大小比较); 如果定位元素z-index发生嵌套: 祖先优先原则(前提:z-index是数值,不是auto)
老业务写了个z-index:5000; B同学调用一个全局弹层,原本设置为100,想要覆盖全局,z-index改为10000; C同学调用一个toast,原本设置为2000,想要覆盖弹层,z-index改为100000; ... 层层覆盖的情况下,不能无限改下去,为了避免这样的情况发生,减少不断覆盖的情况,那么应该如何规定z-index的值呢;
const KEY = '_tbv_z_index_';
function initZIndex$() {
return (window[KEY] = 10000);
}
// 初始化,只能被调用一次
function once(fn) {
const flag = true;
return function () {
if (flag) {
flag = false;
const args = Array.prototype.slice.call(arguments, 0);
fn.apply(args);
}
};
}
const initZIndex = once(initZIndex$);
// 外部调用&支持重置
function zIndex$(zIndex) {
if (zIndex) {
return (window[KEY] = zIndex);
}
return (window[KEY] += 1);
}
// 组件mount时触发+1
const zIndex = zIndex$();
03
CSS3 transform 属性对 position 的影响
CSS3中引入了transform,定义了在二维或三维空间中元素的旋转、缩放、平移等行为,还能利用合成层原理开启GPU加速,提升页面动画的流畅度。然而transform也不是「省油的灯」(并没有说它不好的意思,我就很喜欢它),增强了页面交互效果的同时它也有一些「副作用」容易让人踩坑。
position: fixed 实现了固定定位的效果,元素不追随滚动条进行滚动,普通元素的overflow属性也无法对其进行裁剪,因此在一些需要固定头部、固定悬浮按钮的场景中十分好用。
但fixed遇上transform时表现的就不再那么「强硬」,反而退化成了position: absolute的效果。在外层没有transform影响时,固定定位元素的包含块是根元素,可以近似认为是<html>元素,因此fixed元素可以实现相对视口定位的效果。而当元素设置了transform时,便会创建一个新的包含块(containing block),如果该元素的内部有元素设置了fixed定位,那么该fixed元素的包含块便不再是根元素,而变成了被设置了transform的元素。如果在开发过程中发现设置了position:fixed的元素随着页面滚动了,就可以看下fixed的元素外层是否有元素设置了transfrom。
除了包含块之外,transform还会生成新的层叠上下文(stack context),使得元素内部和外部的z-index相互独立,出现低z-index元素层级比高z-index元素还高的情况:
推荐阅读: